package com.blog.cmrpersonalblog.dto.tag.requset;

import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import jakarta.validation.constraints.Pattern;

/**
 * 标签创建请求
 */
@Data
public class TagCreateRequest {

    /**
     * 标签名称
     */
    @NotBlank(message = "标签名称不能为空")
    @Size(max = 50, message = "标签名称长度不能超过50个字符")
    private String name;

    /**
     * 标签颜色（十六进制颜色码）
     */
    @Pattern(regexp = "^#[0-9A-Fa-f]{6}$", message = "标签颜色必须是有效的十六进制颜色码")
    private String color;

    /**
     * 状态 0-禁用 1-启用
     */
    @NotNull(message = "状态不能为空")
    private Integer status;

    /**
     * 验证状态值是否有效
     */
    public boolean isValidStatus() {
        return status != null && (status == 0 || status == 1);
    }

    /**
     * 验证颜色值是否有效
     */
    public boolean isValidColor() {
        if (color == null || color.trim().isEmpty()) {
            return true; // 颜色可以为空
        }
        return color.matches("^#[0-9A-Fa-f]{6}$");
    }

    /**
     * 验证请求数据是否有效
     */
    public boolean isValid() {
        return name != null && !name.trim().isEmpty() && 
               name.length() <= 50 &&
               isValidStatus() && 
               isValidColor();
    }

    /**
     * 获取安全的颜色值（如果为空则返回默认颜色）
     */
    public String getSafeColor() {
        if (color == null || color.trim().isEmpty()) {
            return generateDefaultColor();
        }
        return color.toUpperCase();
    }

    /**
     * 根据标签名称生成默认颜色
     */
    private String generateDefaultColor() {
        if (name == null || name.trim().isEmpty()) {
            return "#1890FF"; // 默认蓝色
        }
        
        // 根据标签名称的哈希值生成颜色
        int hash = name.hashCode();
        String[] colors = {
            "#1890FF", "#52C41A", "#FAAD14", "#F5222D", 
            "#722ED1", "#13C2C2", "#EB2F96", "#FA8C16",
            "#A0D911", "#2F54EB", "#FA541C", "#FADB14"
        };
        
        int index = Math.abs(hash) % colors.length;
        return colors[index];
    }

    /**
     * 清理和标准化标签名称
     */
    public String getCleanName() {
        if (name == null) {
            return null;
        }
        return name.trim().replaceAll("\\s+", " ");
    }

    /**
     * 检查标签名称是否包含特殊字符
     */
    public boolean hasSpecialCharacters() {
        if (name == null) {
            return false;
        }
        return name.matches(".*[<>\"'&].*");
    }

    /**
     * 获取标签名称的长度（字符数）
     */
    public int getNameLength() {
        return name != null ? name.trim().length() : 0;
    }
}
